/*
 * sysmo 服务器监控项基类
 * Copyright (C) 2009  YuLicheng
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package org.sysmo.server.node.item;

import java.util.List;
import org.sysmo.db.DatabaseInterface;
import org.sysmo.server.node.item.graphgroup.GraphGroup;
import org.sysmo.server.node.item.graphgroup.GraphGroupExistsException;

/**
 *
 * 监控项对象。此类可被实例化为为没有连接客户端的监控项。
 * <br />
 *
 * 被监控节点上可监控的内容按照层次结构分为监控项（项）、图表和监控值（值）。
 * 一个客户端节点可包含多个监控项，一个监控项可包含多个图表，一个图表中可包含
 * 多个监控值。
 * <br />
 *
 * 其中一个监控项包含一个数据采集脚本、一个数据验证脚本，这两个脚本负责采集
 * 和验证此项中的所有图表的所有监控值。一个图表即单张图表图片，属于此图表的
 * 所有监控值会以用户指定的方式叠加绘制到同一张图片上。监控值是最小记录单位。
 * <br />
 *
 * 监控项分为已与客户端连接的监控项和没有和客户端连接的监控项，其中已与客户端连
 * 接的监控项可以进行远程配置，没有连接的监控项则只能查看数据记录，但是仍然可以
 * 对监控项中的图表进行配置，因为这些配置不需要涉及与客户端的通信。
 * <br />
 *
 * 注意：客户端和用户使用监控项名、图表名和监控值名来唯一确定一个监控项，因此
 * 这些项目在命名时不能与同一层次中现有的项目同名。但是系统内部是使用数据库中
 * 配置的ID来识别的。因此用户在设定名称后仍然可以随意修改（只要不重名），然后
 * 需要更新客户端使用的脚本文件的输出以反映相关的修改。服务器在接收到客户端发送
 * 的监控记录时将会重新将相应的名称映射到ID上。
 *
 * @author YuLicheng
 * @see GraphGroup
 * @see ConnectedItem
 */
public class Item {

    /**
     * 数据库访问接口。
     */
    protected DatabaseInterface dbInterface;
    /**
     * 此监控项ID。
     */
    protected int id;

    /**
     * 此构造方法创建一个未连接客户端的监控项实例。此监控必须已存在。
     *
     * @param dbInterface 数据库访问接口。
     * @param id 监控项ID。
     */
    public Item(DatabaseInterface dbInterface, int id) {
        this.dbInterface = dbInterface;
        this.id = id;
    }

    /**
     * 此构造方法只是用于保存数据库访问接口，只由子类调用。
     *
     * @param dbInterface 数据库访问接口。
     */
    protected Item(DatabaseInterface dbInterface) {
        this.dbInterface = dbInterface;
    }

    /**
     * 删除此监控项。这将同时删除其中的所有图表、相应图表中的所有监控值，以及这些
     * 监控值的所有历史记录。另外在删除后还会调用{@link #removed()}方法，以连接
     * 客户端的子类可覆盖此方法来实现发送删除消息到客户端，此时客户端会将相应监控
     * 项的所有配置数据一并删除。
     *
     * @see #removed()
     */
    public void remove() {

    }

    /**
     * 当此监控项被删除后，会调用此方法。{@link ConnectedItem}子类应该覆盖此方法
     * 以发送消息给客户端。本类中此方法没有任何作用。
     *
     * @see #remove()
     */
    protected void removed() {
        
    }

    /**
     * 获取监控项名称。
     *
     * @return 此监控项名称。
     */
    public String getName() {
        return null;
    }

    /**
     * 返回将客户端产生的警告转发到的联系人信息。
     *
     * @return 联系方式
     */
    public WarningContect getWarningContect() {
        return null;
    }

    /**
     * 获取监控项ID。
     *
     * @return 此监控项的ID。
     */
    public int getID() {
        return id;
    }

    /**
     * 获得数据采集时间间隔。此值以分钟为单位。
     * 
     * @return 时间间隔。
     */
    public long getRunInterval() {
        return 0;
    }

    /**
     * 获得此监控项的所有警报列表。
     * 
     * @return 所有警告列表。
     */
    public List<Warning> getWarnings() {
        return null;
    }

    /**
     * 添加一个图表。新添加的图表中没有监控值。
     *
     * @param name 图表名。
     * @return 新增的图表。
     * @throws GraphGroupExistsException 若存在同名图表则抛出此异常。
     */
    public GraphGroup addGraph(String name) throws GraphGroupExistsException {
        return null;
    }

    /**
     * 用图表ID获取图表实例。
     *
     * @param id 图表ID。
     * @return 图表实例
     */
    public GraphGroup getGraph(int id) {
        return null;
    }

    /**
     * 获取此监控项中的所有图表列表。
     *
     * @return 图表列表。
     */
    public List<GraphGroup> getAllGraphes() {
        return null;
    }
    
}
